/**
 * 注册element-plus组件的翻译函数。
 * 如果用type-method的方式，用com.type获取到组件实例的组件类型。
 * import {ElTable} from 'element-plus';那这里就把组件全部引入了，也许与外面引入组件的模式不同。
 * 改用tag-emthod方式。
 */
import acroMLClassMethod from './acroML.ClassMethod.mjs';

let DDKeys={el:{}};
let CurrentDD={el:{}};

function wrap_transElementPlusCom(proc){
  return function(t,instWrap){
    let tag=instWrap.tag;
    if (!tag){
      tag=instWrap.$.type.name;
      //console.log(tag);
      tag=tag.toLowerCase();
      /**
       * 如：把"eltable"转成"table"
       */
      if (tag.startsWith('el')) tag=tag.substring(2);
    }
    /**
     * 按组件名称，从组件多语言字典中获取DDKey
     * 如ElTable的内部DDKey:['emptyText','confirmFilter','resetFilter','clearFilter','sumText'];
     * 注意：可能切换语言后，这时CurrentDD还没加载完成。
     * 但没关系，字典加载完成后，element-plus的全局locale变了会自动刷新预设的组件字串。
     */
    let DDProps=DDKeys.el[tag];
    //if (tag=='pagination') console.log(tag,DDProps);
    if (DDProps){
      let DDValues=CurrentDD.el[tag];
      let inst=instWrap.$;
      //if (tag=='pagination') console.log(inst.props,DDValues);
      for(let propName in DDProps){
        let prop=instWrap.$options.props[propName];
        if (prop && (prop==String || prop.type==String)){
          //console.log('expose prop:',{tag,propName,prop});
          /**
           * 注意：
           * (1)不是DDKeys.el[tag]上所有的属性都定义成了inst的props。
           * 如ELTablesumText有在属性中，但confirmFilter不在。
           * (2)而且两边同一个名称还可能不同含义。
           * 如ElPagination.total属性实际是整数，不是String。DDKeys.el['pagination'].total字串。
           * (3)两个名称可能还不同。
           * 如ElColorPicker.ariaLabel vs el.colorpicker.defaultLabel
           * 因此，这里可以检查哪些属性暴露了，但不适合在这里翻译。
           */
          let propDDKey=DDProps[propName];
          let propValue=DDValues[propName];
          //acroMLClassMethod.translateProp(t,inst.props,propName,propDDKey,propValue);
        }
      }
    }
    //console.log(inst);
    proc(t,instWrap);
  }
}

function t_ElTable(t, instWrap){
  /**
   * 虽然D:\nodejs\npm-global\node_modules\element-plus\es\locale\lang\en.mjs中，
   * 看到el.table其下有'emptyText','sumText','confirmFilter','resetFilter','clearFilter'这5个字串，
   * 但是实际定义到table组件属性中可以让用户修改的只有前两个。
   */
  let inst=instWrap.$;
  //console.log('t_ElTable',instWrap);
  acroMLClassMethod.translateProps(t,inst.props,
    ['emptyText','sumText']
  );
  let columns=instWrap.columns;
  if (columns){
    for(let i=0;i<columns.length;i++){
      acroMLClassMethod.translateProp(t,columns[i],'label');
    }
  }
}
function t_ElButton(t, instWrap){
  //console.log('t_ElButton',instWrap);
  acroMLClassMethod.translateProp(t,instWrap.$el,'innerText');
}
function t_ElTag(t, instWrap){
  //console.log(instWrap);
  acroMLClassMethod.translateProp(t,instWrap.$el,'innerText');
}
function t_ElCheckbox(t, instWrap){
  //console.log(instWrap);
  let inst=instWrap.$;
  acroMLClassMethod.translateProp(t,inst.props,'label');
}
function t_ElColorPicker(t, instWrap){
  //console.log('t_ElColorPicker',instWrap);
  let inst=instWrap.$;
  acroMLClassMethod.translateProps(t,inst.props,['ariaLabel']);
}
function t_ElTabs(t, instWrap){
  //console.log(instWrap);
  let inst=instWrap.$;
  /**
   * 注意：ElTabs内的ElTabPane与ElTable内的ElTableColumn处理方式不同。
   */
}
function t_ElTabPane(t, instWrap){
  //console.log(instWrap);
  let inst=instWrap.$;
  acroMLClassMethod.translateProp(t,inst.props,'label');
}

function t_ElPagination(t, instWrap){
  //console.log('t_ElPagination',instWrap);
  let inst=instWrap.$;
  acroMLClassMethod.translateProps(t,inst.props,
    ['prevText','nextText']
  );
  //console.log(inst.props);
}

function t_ElPaginationTotal(t, instWrap){
  //console.log('t_ElPaginationTotal',instWrap);
  // let inst=instWrap.$;
  //console.log(inst.props);
}

function t_ElDatePicker(t, instWrap){
  //console.log('t_ElDatePicker',instWrap);
  let inst=instWrap.$;
  acroMLClassMethod.translateProps(t,inst.props,
    ['placeholder','startPlaceholder','endPlaceholder','rangeSeparator']
  );
  let shortcuts=inst.props.shortcuts;
  if (shortcuts){
    for(let i=0;i<shortcuts.length;i++){
      let shortcut=shortcuts[i];
      acroMLClassMethod.translateProps(t,shortcut,['text']);
    }
  }
}
function t_ElTimePicker(t, instWrap){
  //console.log('t_ElTimePicker',instWrap);
  let inst=instWrap.$;
  acroMLClassMethod.translateProps(t,inst.props,
    ['placeholder','startPlaceholder','endPlaceholder','rangeSeparator']
  );
  let shortcuts=inst.props.shortcuts;
  if (shortcuts){
    for(let i=0;i<shortcuts.length;i++){
      let shortcut=shortcuts[i];
      acroMLClassMethod.translateProps(t,shortcut,['text']);
    }
  }
}
function t_ElInput(t, instWrap){
  let inst=instWrap.$;
  acroMLClassMethod.translateProps(t,inst.props,
    ['placeholder']
  );
}
function t_ElInputNumber(t, instWrap){
  let inst=instWrap.$;
  acroMLClassMethod.translateProps(t,inst.props,
    ['placeholder']
  );
}
function t_ElSelect(t, instWrap){
  let inst=instWrap.$;
  //console.log('t_ElSelect',instWrap);
  acroMLClassMethod.translateProps(t,inst.props,
    ['placeholder','noDataText','noMatchText']
  );
  /**
   * 内部ElOption通过t_ElOption翻译
   */
}

function t_ElOption(t, instWrap){
  let inst=instWrap.$;
  //console.log('t_ElOption',instWrap);
  acroMLClassMethod.translateProp(t,inst.props,'label');
}

function t_ElRate(t, instWrap){
  let inst=instWrap.$;
  //console.log('t_ElRate',instWrap);
  let texts=inst.props.texts;
  /**
   * 注意：texts是数组
   */
  if (texts) acroMLClassMethod.translateArray(t,texts);
}

function t_ElSwitch(t, instWrap){
  let inst=instWrap.$;
  //console.log('t_ElSwitch',instWrap);
  acroMLClassMethod.translateProps(t,inst.props,['activeText','inactiveText']);
}

function setDDKeys(value){
  DDKeys=value;
}

function setCurrentDD(dd){
  CurrentDD=dd;
}

function translateDD(t,DD){
  function _trans(node){
    for(let id in node){
      if (id=='_acroml_') continue;
      let value=node[id];
      if (typeof value=='object'){
        //console.log(value);
        _trans(value);
      }
      else{
        acroMLClassMethod.translateProp(t,node,id,value);
      }
    }
  }
  if (!DD) DD=DDKeys;
  _trans(DD.el);
}

function register(c,m){
  acroMLClassMethod.register(c,wrap_transElementPlusCom(m));
}

register('ElTable',t_ElTable);
register('ElRadio',acroMLClassMethod.t_element);
register('ElButton',acroMLClassMethod.t_element);
register('ElCheckbox',t_ElCheckbox);
register('ElColorPicker',t_ElColorPicker);
register('ElTabs',t_ElTabs);
register('ElTabPane',t_ElTabPane);
register('ElTag',acroMLClassMethod.t_element);
register('ElPagination',t_ElPagination);
register('ElPaginationTotal',t_ElPaginationTotal);
register('ElDatePicker',t_ElDatePicker);
register('ElTimePicker',t_ElTimePicker);
register('ElInput',t_ElInput);
register('ElInputNumber',t_ElInputNumber);
register('ElSelect',t_ElSelect);
register('ElOption',t_ElOption);
register('ElRate',t_ElRate);
register('ElSwitch',t_ElSwitch);

export default {setDDKeys,setCurrentDD,translateDD,t_ElTable}
export {setDDKeys,setCurrentDD,translateDD,t_ElTable}